#include "../tools.h"

class LRUCache {
// 最近最少使用
// LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
// int get(int key) 如果关键字 key 存在于缓存中，则返回关键字的值，否则返回 -1 。
// void put(int key, int value) 如果关键字已经存在，则变更其数据值；如果关键字不存在，则插入该组「关键字-值」。
//      当缓存容量达到上限时，它应该在写入新数据之前删除最久未使用的数据值，从而为新的数据值留出空间。

public:
    int size;
    list<pair<int, int>> data;
    unordered_map<int, list<pair<int, int>>::iterator> map;

    LRUCache(int capacity) {
        size = capacity;
    }
    
    int get(int key) {
        if(map.find(key) == map.end()) return -1;

        data.splice(data.begin(), data, map[key]);
        return map[key]->second;
    }
    
    void put(int key, int value) {
        if(get(key) != -1) map[key]->second = value;
        else{
            if(data.size() == size){
                int dkey = data.back().first;
                map.erase(dkey);
                data.pop_back();
            }
            data.emplace_front(key, value);
            map[key] = data.begin();
        }
    }
};



int main(int argc, char const *argv[])
{
    
    LRUCache cache(2);
    cache.put(1, 1);
    cache.put(2, 2);
    cout << cache.get(1) << endl;
    cache.put(3, 3);
    cout << cache.get(2) << endl;
    cache.put(4, 4);
    cout << cache.get(1) << endl;
    cout << cache.get(3) << endl;
    cout << cache.get(4) << endl;
    

    return 0;
}
